package com.gzc.just.play.last.war.common.serializer;

/**
 * 序列化器工厂类
 * 统一管理项目中使用的序列化方式，便于维护和切换
 * 使用单例模式管理序列化器实例，避免重复创建对象
 */
public class SerializerFactory {
    /**
     * 当前使用的序列化类型
     */
    public enum SerializerType {
        PROTOBUF,
        JAVA
    }
    
    // 默认使用Protobuf序列化
    private static SerializerType currentSerializerType = SerializerType.PROTOBUF;
    
    // 序列化器单例实例
    private static volatile MessageSerializer protobufSerializer;
    private static volatile MessageSerializer javaSerializer;
    
    /**
     * 设置当前使用的序列化类型
     * @param type 序列化类型
     */
    public static synchronized void setSerializerType(SerializerType type) {
        if (currentSerializerType != type) {
            currentSerializerType = type;
            // 切换类型时重置序列化器
            resetSerializers();
        }
    }
    
    /**
     * 获取当前使用的序列化类型
     * @return 当前序列化类型
     */
    public static SerializerType getCurrentSerializerType() {
        return currentSerializerType;
    }
    
    /**
     * 获取当前配置的序列化器实例（单例模式）
     * @return 序列化器实例
     */
    public static MessageSerializer getSerializer() {
        switch (currentSerializerType) {
            case JAVA:
                if (javaSerializer == null) {
                    synchronized (SerializerFactory.class) {
                        if (javaSerializer == null) {
                            javaSerializer = new JavaSerializer();
                        }
                    }
                }
                return javaSerializer;
            default:
                if (protobufSerializer == null) {
                    synchronized (SerializerFactory.class) {
                        if (protobufSerializer == null) {
                            protobufSerializer = new ProtobufMessageSerializer();
                        }
                    }
                }
                return protobufSerializer;
        }
    }

    /**
     * 获取当前序列化器的名称
     * @return 序列化器名称
     */
    public static String getSerializerName() {
        switch (currentSerializerType) {
            case PROTOBUF:
                return "Protobuf";
            case JAVA:
                return "Java";
            default:
                return "Unknown";
        }
    }
    
    /**
     * 重置序列化器实例（用于切换序列化类型时清理旧实例）
     */
    public static synchronized void resetSerializers() {
        protobufSerializer = null;
        javaSerializer = null;
    }
}